```LAGRANGE
           __   __             __   ___
|     /\  / _` |__)  /\  |\ | / _` |__
|___ /~~\ \__> |  \ /~~\ | \| \__> |___

```
# Release notes

## 1.18 (Beta 35)
* Added option to disable page width expansion to fit long lines.
* Limited page width expansion to 33% so room is left for the current title in the margin.
* Audio player UI shows number of downloaded bytes if length of audio is still unknown.
* Strip CR characters in content pasted to input fields. Line breaks are expected to be just LFs.
* Fixed use of non-Gemini search URLs. (Do not force-prepend "gemini://".)
* Fixed handling of the reserved `:` character in URL paths.
* Updated UI translations.

## 1.18 (Beta 34)
* Fixed accidental navigation when editing text with the keyboard.
* Fixed handling of the Return key in text fields.
* Misfin: URI format has changed to "misfin:address?message" instead of the previously used "misfin://address". The optional query string ("message") is used as the initial message contents if the upload dialog's text editor is empty.
* Fixed redirection counting (and related warnings) when requesting Titan URIs.
* Updated UI translations.

## 1.18 (Beta 33)
* Fixed crash when uploading data due to uninitialized memory.
* Fixed perpetual load spinner animation when redirected to a Titan URL.
* Potential workaround for a crash during feed refresh.
* Increased number of concurrent feed subscription requests (now 10, was 4).

## 1.18 (Beta 32)
* Fixed scrolling momentum when display refresh rate is not 60 Hz.
* Fixed incorrect input widget being focused in Upload dialog's URL path panel.
* Fixed installing font files. All fonts were mistakenly thought to be already installed, so no option to install was offered.

## 1.18 (Beta 31)
New features:
* Support for sending Misfin messages. "misfin://" links are opened in the upload dialog. You must import a Misfin identity before you can send a message.
* Misfin: Identity list indicates which identities are for Misfin.
* Support for the Guppy protocol. Contributed by Dima Krasner.
* Titan: Support for the "edit" parameter in opened Titan links. The target's contents are downloaded and displayed in the upload dialog's text editor. After editing the contents are uploaded back to the server.
* Option to disable all TLS security warnings.

Changes and enhancements:
* Improved UI focus navigation: arrow keys move focus to an adjacent widget.
* Context menus are keyboard-navigable with arrow keys, and the first letter of labels acts as a shortcut key to move focus on the item.
* Bookmarked URLs are automatically updated after permanent redirection. (The original URL is still saved in bookmarks.ini.)
* Line width expands dynamically (up to window size) to account for wide content like preformatted blocks and plain text lines.
* Long-pressing the site banner shows a link context menu. (Linking to the capsule's root URL.)
* Page Information: Clarified meaning of "fingerprint". The type of hash (SHA-256) and what it was calculated from are specified (full certificate or just the public key).
* Updated UI symbols for "Go to Root", remote bookmarks, and the navbar bookmark indicator/button.
* Gopher: Proper parsing of Telnet line types `8` and `T`.
* Noto Emoji font updated to support Unicode 15.1.

Fixes:
* Titan URLs were incorrectly opening the upload dialog when navigating through history.
* Titan request in an open tab was resubmitted with empty content when launching the app.
* Default Titan upload identity was sometimes chosen incorrectly; should match the active Gemini identity.
* Upload dialog was missing a couple of UI strings for drag-and-drop errors.
* Gopher: Gemtext formatting (headings, quotes, etc.) found on Gopher menu pages is now escaped so it doesn't unintentionally affect the visual presentation.
* Gopher: Allow port number to be blank on `i` lines.
* Query shortcuts (bang snippets) that already contain a `?` character were prefixed by a redundant `?`.
* Link ordinals/letters (when navigating with Alt/Option or home row keys) now start at the actual top of the view.
* Missing focus indication in empty lists and the Snippets list.
* Holding down Alt/Option (link number modifier key) while opening a query link would prevent the prompt dialog from having input focus.
* Incorrect glyph spacing in a mixed-font preformatted block (fallback glyphs from different fonts).
* Lede paragraph highlighting was misbehaving with monospace body font; now gets disabled.
* Glyphs were sometimes partially cut off due to excessive background clearing on adjacent lines.

## 1.17 (Beta 30]9

* Fixed looking up glyphs from the bundled Iosevka font when another monospace font is configured as the default.
* Fixed spacing of Legacy Computing symbols on mixed-font monospace lines.

## 1.17 (Beta 29)
* Fixed various potential (rare) crashes.
* Fixed selection of monospaced fallback glyphs.
* Fixed spacing on mixed-font monospaced text lines.
* Updated UI translations.

## 1.17 (Beta 28)
* Page zoom pinch gesture has a short trigger delay to avoid accidental zooming.
* Query shortcuts (bang snippets) that already contain a `?` character were prefixed by a redundant `?`.
* Fixed a link being opened inadvertently after the link's context menu is dismissed (by tapping outside the menu or by selecting "Cancel").
* Updated UI translations.

## 1.17 (Beta 27)
* Fixed selection markers jumping around when trying to drag them.
* Fixed scrolling speed when dragging selection markers. Sometimes the view jumped to the top/bottom of the page.

## 1.17 (Beta 26)
* Fixed memory leak: fetched pages were not always released from memory (reference miscount).
* Fixed minor memory leak in list widgets.
* Gopher: Autodetect Gemtext files based on file extension.
* Updated UI translations.

## 1.17 (Beta 25)
* Fixed a few small memory leaks.
* Gopher: Detect audio media type from file extension with the `s` item type (it's not always WAV).
* Content that uses `charset=utf-8` is checked for validity. If the encoding is invalid, the content is instead decoded as CP437 (if it has ANSI escapes; possibly it's ASCII art) or just Latin-1.
* Modified rule for when 'text/plain' is assumed to actually be 'text/gemini' based on the file extension.
* Updated dependencies to newer versions (OpenSSL, GNU FriBidi, libiconv, libunistring).

## 1.17 (Beta 24)
* Tabs opened in background are immediately added to the URL history.
* Fixed initial scope of a created identity when using the default selection.
* Fixed current text selection extending during scrolling even after mouse button has been released.
* Fixed inline image loading indicator overdrawing itself, becoming unreadable.
* ANSI Cursor Forward control sequence ("CSI n C") is converted to a series of spaces, but only in preformatted text.
* Fixed parsing of ANSI SGR sequences with many attributes concatenated (e.g., 0;1;40;30).
* Updated UI translations.

## 1.17 (Beta 23)
* Added "Vibrant Light" color theme.
* Improved readability of "Colorful Light" headings.
* Preformatted blocks no longer switch to a smaller font to fit to the page.
* Fixed horizontal scrolling issues with preformatted blocks: only scroll if needed, allow scrolling anywhere on the block and not just on non-empty text lines, and when scrolling disallow swipe navigation over the area.
* Fixed visual artifacts around and next to preformatted blocks (e.g., streaking).
* Fixed potential crash after (un)folding a preformatted block.
* Fixed links being non-clickable after searching text on a page has scrolled the view.
* Fixed scroll position being reset when reloading the page.
* Fixed missing page context menu items.
* Fixed "View as Plain Text" context menu item after reloading a page.
* Strip any null characters from the page source during whitespace normalization.

## 1.17 (Beta 22)
* Long-press actions on the toolbar: provide access to all the available toolbar actions. Open Settings > Identities by long-pressing on the Identity button.
* Snippets: A collection of short text segments that can be pasted into input prompts and the upload editor. For example, useful for your gemlog header/footer and other often-repeated entries.
* Snippets can be managed in Settings > Snippets and created via the link context menu or by selecting text on a page.
* Custom search queries: Snippets whose name starts with a bang (e.g., "!w") can be invoked in the URL field to make customized queries. The snippet content should be a Gemini search URL, for example: "gemini://gemi.dev/cgi-bin/wp.cgi/search".
* Quick lookup shows matching snippets as a new type of search result.
* Recently submitted input prompt contents are saved persistently and can be restored via the Ellipsis utility menu in the prompt dialog.
* You can force the input prompt to appear before a certain URL is requested so you can enter a query string. This is useful for avoiding an extra request when it is known that a URL will require input (e.g., search engine, game input).
* When importing links as bookmarks, you can optionally create subfolders from headings. You can also choose a destination folder for the imported bookmarks.
* Quickly add/move a bookmark into a folder with the navbar bookmark button context menu (long-press on 🏷️).
* User-selectable feed refresh interval. Previously the interval been hardcoded to four hours. (Based on a patch by Michael Nordmeyer.)
* Setting to never/always collapse preformatted blocks, disabling the ability to toggle the folding.
* "Fold All" and "Unfold All" in Bookmarks sidebar context menu.
* "Search" context menu item on selected text to make a search query with it.
* "Use as Search URL" in link context menu.
* Menus can have submenus. Several of the old menus were reorganized accordingly. For example, the page context menu has a Tools submenu for translation, Titan uploads, etc.
* "Mark All Links as Visited" in the Tools submenu of the page context menu.
* Support for the Nex protocol (nex://nightfall.city/nex/info/specification.txt).
* Show unsupported media types as plain text if the content is valid UTF-8 encoded text.
* The page scrolls while selecting text near top/bottom.
* Display a logo graphic in empty windows/tabs as a placeholder.
* Adjusted colors of the Import Identity dialog.
* Tuned theme color palette and improved background colors of "Colorful Light".
* Newly created client certificates have a default expiration date in the year 9999, which means they won't expire. One can still also set a specific date as before.
* Fixed incorrect name displayed in page banner when URL query string contains a tilde name.
* Fixed glitches during swipe navigation. Behavior is more robust at ends of history and when content is not immediately available in cache.
* Fixed a text rendering issue where glyphs were incorrect when preceded by a Narrow No-Break Space.

## 1.16 (Beta 21)
* Fixed crash when the contents of a link line would fail to be recognized as valid characters.
* Empty new tabs are appended to the right edge. Previously they were inserted next to the active tab.
* Improved tab closing order: close all sibling tabs opened from an origin tab before switching back to the origin tab.
* Remove whitespace from ends of a URL entered into an input field.

## 1.16 (Beta 20)
* Fixed links whose label is a single Emoji sometimes not appearing.
* The navbar URL field only omits the "gemini:" scheme when the text actually doesn't fit horizontally, and only when the field is inactive.
* Fixed problems with handling URLs in input fields. For example, copying the URL to the clipboard sometimes had unexpected or incorrect results.
* Updated UI translations.

## 1.16 (Beta 19)
* Fixed broken Titan uploads due to the contents of the upload path field being mishandled.

## 1.16 (Beta 18)
* Fixed hardware Enter key handling in the navbar.
* The "gemini://" scheme is shown in active URL input fields even when omitted otherwise.
* Preferences: Changed order of network settings.
* Preferences: Added option for silently following scheme-changing redirects (Network tab; default: no).
* Tab creation and closing follows common browser conventions: new tabs are opened next to the most recently opened tab, so they retain the correct left-to-right order.
* Page title in margin omits prefix Emoji if it matches the bookmark icon.
* Adjusted word-wrapping to break at a period inside a word (e.g., domain names).
* If the page is missing a level 1 heading, use the first content line as the title.
* Fixed incorrect parsing of "hostname:port" in URL field (without `//` or `gemini://`).
* Fixed input query dialogs not being hidden when the tab changes.
* Fixed potential crash when switching between cached pages while navigating in history.
* Fixed potential crash when closing split view during a scrolling animation.
* Updated UI translations.

## 1.15 (Beta 17)
* Fixed tab order getting reversed when restoring tabs at launch.
* Fixed order of opened tabs when using "Open in New Tabs" on a bookmark folder.

## 1.15 (Beta 16)
* Added new UI translation: Basque (euskara).
* Improved opening and closing of tabs. New tabs now open to the right of the current tab.
* Fixed possible crash when closing tabs.
* Potential workaround for a crash when saved application state contains a query prompt page.
* Allow scaling up small images up to 2x size.
* Updated UI translations.

## 1.15 (Beta 15)
* Added 19 new translated languages, "Auto-detect" source language, and an option to skip preformatted blocks when translating.
* Fixed several bugs in processing page contents for translation.
* Fixed handling of redirects when fetching subscribed feed pages.
* Fixed handling of redirects in the inline media player and file downloader.
* Fixed scroll position being sometimes slightly off when relaunching the app.

## 1.15 (Beta 14)
* Settings: Long labels are wrapped to fit in view.
* Removed the [+] button from the tab bar in portrait phone layout to conserve space. (New tabs can be created via the navbar menu or via customized toolbar buttons.)
* Centered footer info text for better balance, and now it's hidden below the page in the overscroll area.
* Fixed possible animation and scroll position issues related to swiping.

## 1.15 (Beta 13)
* Tab reordering: tab buttons are draggable.
* Improved item grouping in the navbar menu.
* Footer information moved under the page content, out of the margin area. This information has not been visible on the phone before.

## 1.15 (Beta 12)
* Added auto-reload indicator (reload button shown as outline).
* Added UI settings to toggle edge/on-page navigation swipe gestures.

## 1.14 (Beta 11)
* Try to keep user data safe in unusual situations. Bookmarks and identities are saved via a system API, while also ensuring that data written to storage is not truncated. NOTE: Uninstalling the app will still delete everything, because user data is only stored locally.
* User data files are now stored in external storage, if available.
* Fixed determining actual name of files opened via the system file picker. This was sometimes preventing importing archived user data, for instance.

## 1.14 (Beta 10)
* Fixed tab with pinned identity not closing if it's the last tab that's being closed.
* Fixed hang when setting a folder's parent to itself in the Edit Folder dialog.
* Updated UI translations.

## 1.14 (Beta 9)
* Fixed pinned identity being forgotten when navigating to parent/root.
* Improved layout of the bookmark editor dialog.
* Avoid over-saturating green text in the Colorful Dark theme.
* Updated UI translations.

## 1.14 (Beta 8)
* Settings: Added a "User Data" section for export/import and listing bookmarks, feeds, and downloads.
* Improved behavior of pinned bookmark identities.
* Indicate a pinned identity with an outline icon in the toolbar.
* When creating new identities, make it clearer what the scope of usage will be. The UI actions explicitly say "New Identity for Domain" when the default usage will be the entire domain.
* Page scroll position is kept when loading finishes, if the user already scrolled during loading.
* Scroll indicators fade away in Settings are other dialogs as expected.
* Fixed accidental backwards navigation when quickly refreshing the page twice.
* Fixed "More..." button staying visible in identity creation dialog.
* Fixed opening downloaded files in another app.
* Fixed opening Gemini URIs when another app opens Lagrange.
* Adjusted input field margins.

## 1.14 (Beta 7)
New features:
* A bookmark folder can be opened in new tabs, one tab per contained bookmark.
* New bookmark property "Set identity": use a specific identity when opening the bookmark, but don't apply it persistently on the bookmarked URL.

Changes and enhancements:
* Revised swipe gestures: back/forward swipe can be started anywhere on the page. Swiping from the left edge brings up the sidebar when in landscape orientation. The sidebar can also be swiped away.
* MIME types of many new file extensions are recognized (courtesy of John Cowan).
* Updated UI translations.

Fixes:
* Schemeless relative URLs no longer assume "gemini" as the scheme, instead using the current page's scheme as default.
* Opening a feed entry in a background tab will mark is as read, like opening in the foreground does.
* ANSI escapes 39 and 49 (reset FG/BG color to default) were not working.
* Fixed a layout issue in the translation dialog.
* Cleaned up a few UI labels.

## 1.13 (Beta 6)
* Enabled audio output. WAV and Ogg Vorbis decoding is supported in this build. NOTE: At the moment, playback is not supported when app is in the background, or when the screen is locked. Also, playback may not start if there is already an active player on the page.
* Fixed showing error page for an empty server response.
* Fixes for Spartan: query strings, input prompt default content, empty paths.
* Added Spartan URL handler.

## 1.13 (Beta 5)
New features:
* URL field indicator 🔖 that shows if there's a bookmark for the current page. Clicking on the indicator opens the Add/Edit Bookmark dialog. The indicator is shown in landscape mode.
* Support for the Spartan protocol. Prompt lines will open an input dialog for submitting text. This can be expanded to the full upload dialog using which a file can be uploaded, too.
* Reopening the last closed tab.
* Page context menu item "View as Plain Text".
* Option to view Markdown as source or as a Gemtext conversion (default: as source).
* Checking server certificates using a bundled root CA file, for instance when the server is using a Let's Encrypt certificate.
* WebP image decoding.

Changes and enhancements:
* Updated Noto Emoji font with support for Unicode 14. There should be no more missing Emoji glyphs.
* When bookmarking a page, show the Edit Bookmark dialog if there's already a bookmark for the URL. The Edit Bookmark dialog has a new Duplicate button for actually making a duplicate bookmark.
* Markdown documents support horizontal rules.

Fixes:
* Show a proper error page if server closes the connection before a header is fully received.
* Sidebar page outline not updated when the current tab changes.

## 1.12 (Beta 4)
* Use system-provided file pickers for opening/saving files.
* Selecting a file for importing a client certificate.
* Selecting a file for uploading.
* Importing exported user data archives.
* Settings: Added "Export User Data".
* Feeds: Added "Mark Below as Read".
* No more extra fields in bookmark dialog when editing a folder.
* Fixed invalid contents appearing in the overscroll areas of lists.

## 1.12 (Beta 3)
* Fixed possible crash when opening Settings or focusing the URL field.
* Fixed incorrect tab bar position after dismissing the onscreen keyboard.
* Fixed pasting URLs: percent-encoded reserved characters should not be decoded.
* Fixed saving of the "Hide toolbar on scroll" setting.

## 1.12 (Beta 2)
* Fixed entered text being ignored on some devices/Android releases.
* Fixed an issue with input prompts. If the prompt was reopened quickly, the entered text would be ignored.

## 1.12 (Beta 1)
* Input fields use the operating system's native text editors.
* Colors of the status bar and the device navigation bar change depending on UI/theme colors.
* Adjusted scrolling behavior to be more like regular Android scrolling.
* Changed appearance of many dialogs to use a card layout instead of fullscreen.
* Input prompts appear next to the keyboard, putting action buttons more within reach.
* Added Import and Create actions on the Identities page in Settings.
* Adjusted UI layout of Settings. The title of the current page appears in the top bar, together with any relevant actions.
* Changed appearance of the pull down indicator.
* Fixed glitches with showing and hiding lookup results.
* Fixed incorrect document width after changing orientation from landscape to portrait.

## 1.12 (Alpha 7)
* Roboto is the new default content/UI font.
* Added option to move the URL field and/or the tab bar at the bottom.
* Toggles use symbols instead of YES/NO.
* UI uses only one accent color at a time.
* Added new UI accent colors: Red, Green, Blue, Gray.
* Added new content theme "Oceanic" with support for both dark and light modes.
* Adjusted generated palettes of Colorful Dark/Light.
* Improved the Sepia theme, and added a dark mode variant.
* Added style option to justify long paragraphs.
* Text renderer uses additional subpixel offsets with lower-density displays.
* Text rendering optimizations: avoid repeated shaping of the same text.
* Fixed occasional small gaps between glyph backgrounds.
* Fixed problems with marking feed entries as read/unread.
* Fixed issues with focused input fields.

## 1.11 (Alpha 6)
⚠️ Downgrading back to v1.10 causes all site-specific themes to be forgotten.

New features:
* Site-specific settings dialog: theme customization and showing ANSI escape warnings. The custom theme is based on a "seed string" chosen by the user.
* Fontpack search. Fonts in the skyjake.fi font library have been indexed based on all the glyphs they provide, so one can look up which fontpacks provide any missing glyphs.
* "Tab width" setting (default: 8). This controls how TAB characters are displayed on pages.
* Setting for maximum valid URI length on 'text/gemini' link lines.
* Option to show images decoded from data URLs immediately after loading a page. This is limited to JPEG, PNG, WebP, and GIF (no animations).
* TLS session caching: reduces the need for redundant handshaking by keeping old TLS sessions cached for 10 minutes.
* UI language for Italian.

Changes and enhancements:
* The input prompt dialog saves entered text persistently, just like the Upload dialog. This prevents losing text if the dialog is closed accidentally.
* The missing glyphs warning dialog now shows a list of the missing code points.
* Abbreviate font pack descriptions on "about:fonts". The full description is shown when viewing a single fontpack.
* The active tab button uses the theme background color if the page color theme has a bright colorful background to avoid clashing with the UI accent color.
* Adjusted colors of the Gray and Black page themes.
* Added additional (small) variations to theme hues.
* Data URLs have their own link icon.

Fixes:
* Incorrect behavior and UI glitches related to data URLs. The UI will now omit the encoded part of data URLs.
* Occasional mismatch between page and banner backgrounds. It was due to loss of precision when converting colors to 8-bit RGB.
* TAB characters are no longer forcibly normalized to spaces.
* Pasting LF characters in the URL field should not be possible.

## 1.10 (Alpha 5)
* Fixed cancelling an input query. Now pressing Cancel will navigate back to the previous page as intended.
* Gopher: Fixed navigating to parent. Set item type to 1 to show a gophermap and not the plain source.
* Updated Smol Emoji: added the rest of Unicode 8 Emoji glyphs.

## 1.10 (Alpha 4)
* Save downloads to the external storage so they're accessible from a file manager.
* Handle Gemini, Gopher and Finger URIs opened from other apps.
* Back button dismisses UI panels/dialogs when appropriate instead of navigating back.

## 1.10 (Alpha 3)
* Added Android-specific release notes.
* Added Settings > UI > Toolbar Actions: customize the two leftmost phone toolbar buttons.
* Show build version in Settings > About.
* Changed return key behavior to insert newlines where possible.
* Fixed sizing of the UI when the device has on-screen system keys.
* Fixed the copy/paste menu staying hidden behind the keyboard.
* Fixed system Auto-Rotate setting not locking the screen orientation.

## 1.10 (Alpha 2)
* Upgraded SDL to 2.0.18, which fixed a lot of stability issues.
* Added native binaries for arm64, x86, and x86_64.
* Enabled bidirectional text and complex scripts (with HarfBuzz and FriBidi).
* Enabled switching to landscape orientation.

## 1.10 (Alpha 1)
Initial test build with SDL 2.0.5 and 32-bit ARM binaries. It works, but barely.